#include"mystdio.h"

myFILE* my_fopen(const char *path, const char *flag)
{
  int flag1 = 0;
  //标记位：
  int iscreate = 0;
  //文件的权限
  mode_t mode = 0666;
  if(strcmp(flag, "r") == 0)
  {
    flag1 = (O_RDONLY);
  }
  else if(strcmp(flag, "w") == 0)
  {
    flag1 = (O_WRONLY | O_CREAT | O_TRUNC);
    iscreate = 1;
  }
  else if(strcmp(flag, "a") == 0)
  {
    flag1 = (O_WRONLY | O_CREAT | O_APPEND);
    iscreate = 1;
  }
  else
  {}

  int fd = 0;
  if(iscreate)
    fd = open(path, flag1, mode);
  else
    fd = open(path,flag1);

  if(fd < 0) return NULL;

  myFILE *fp = (myFILE*)malloc(sizeof(myFILE));
  if(!fp) return NULL;
  
  fp->fileno = fd;
  fp->flags = FFLUSH_LINE;

  fp->cap = LINE_SIZE;
  fp->pos = 0;
  return fp;
}


void my_fflush(myFILE *fp)
{
  write(fp->fileno, fp->cache, fp->pos);
  fp->pos = 0;
}


ssize_t my_fwrite(myFILE *fp, const char *data, int len)
{
  //写入操作本质是拷贝，如果条件允许，就刷新，否则不做刷新
  memcpy(fp->cache+fp->pos, data, len); //肯定要考虑越界，自动扩容
  fp->pos += len;
  if((fp->flags&FFLUSH_LINE) && fp->cache[fp->pos-1] =='\n')
  {
    my_fflush(fp);  
  }
  return len;
}


void my_fclose(myFILE *fp)
{
  my_fflush(fp);
  close(fp->fileno);
  free(fp);

}



